02 - Transistors Model for not uniform wafer (variant Vt property)

Definicion de variables para simular el Vt que varia sobre una oblea


In [1]:
from IPython.core.display import Image, display
display(Image(url='images/TipicalValuesLongChannel.png'))


Variacion por cuadro de Vt del 0.0004%


In [2]:
%matplotlib inline
import math
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import pylab as plb
def matrix(m_length,m_width):
    "Return matrix with no homogeneus resitivity"
    m = np.zeros((m_length,m_width))
    return m
Material_length=963e-6
scmos_process = 3.e-6
wafer_thickness = 0.05e-6
Vt_n_base = 800e-3
Vt_p_base = 900e-3
size_m = Material_length/scmos_process
delta_Vt=0.32e-3
plt.style.use('ggplot')

Matriz de Vt ideal Vt_n_Ideal


In [3]:
Vt_n_Ideal = matrix(int(size_m),int(size_m))
for i in range(0,int(math.sqrt(Vt_n_Ideal.size))):
    for j in range(0,int(math.sqrt(Vt_n_Ideal.size))):
        Vt_n_Ideal[i][j]= Vt_n_base
        
plt.matshow(Vt_n_Ideal)
plt.show()


Matriz de Vt ideal Vt_p_Ideal


In [4]:
Vt_p_Ideal = matrix(int(size_m),int(size_m))
for i in range(0,int(math.sqrt(Vt_p_Ideal.size))):
    for j in range(0,int(math.sqrt(Vt_p_Ideal.size))):
        Vt_p_Ideal[i][j]= Vt_p_base
        
plt.matshow(Vt_p_Ideal)
plt.show()


OPCION 1 Creacion de las matrices del material con variaciones en Vt_n y Vt_p a partir de la esquina


In [5]:
Vt_n = matrix(int(size_m),int(size_m))
def set_corner_Vt_n():
    for i in range(0,int(math.sqrt(Vt_n.size))):
        for j in range(0,int(math.sqrt(Vt_n.size))):
            Vt_n[i][j]= Vt_n_base+(i+j)*delta_Vt
set_corner_Vt_n()            
plt.matshow(Vt_n)
plt.show()



In [6]:
Vt_p = matrix(int(size_m),int(size_m))
def set_corner_Vt_p():
    for i in range(0,int(math.sqrt(Vt_p.size))):
        for j in range(0,int(math.sqrt(Vt_p.size))):
            Vt_p[i][j]= Vt_p_base+(i+j)*delta_Vt
set_corner_Vt_p()
plt.matshow(Vt_p)
plt.show()


OPCION 2 Creacion de las matrices del material con variaciones en Vt_n y Vt_p del centro hacia afuera


In [7]:
Vt_n = matrix(int(size_m),int(size_m))
def centroid_Vt_n(center,i,j):
    "Return a value of Vt_n for a single shape"
    difJ=abs(center-j)
    difI=abs(center-i)
    xy=0
    if difJ > difI:
        xy=difJ
    else:
        xy=difI
    Vtn= Vt_n_base+(xy)*delta_Vt
        
    return Vtn
def set_centroid_Vt_n():
    for i in range(0,int(math.sqrt(Vt_n.size))):
        for j in range(0,int(math.sqrt(Vt_n.size))):
            Vt_n[i][j]= centroid_Vt_n((int(math.sqrt(Vt_n.size))-1)/2,i,j)
set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()



In [8]:
Vt_p = matrix(int(size_m),int(size_m))
def centroid_Vt_p(center,i,j):
    "Return a value of Vt_p for a single shape"
    difJ=abs(center-j)
    difI=abs(center-i)
    xy=0
    if difJ > difI:
        xy=difJ
    else:
        xy=difI
    Vtp= Vt_p_base+(xy)*delta_Vt
        
    return Vtp
def set_centroid_Vt_p():
    for i in range(0,int(math.sqrt(Vt_p.size))):
        for j in range(0,int(math.sqrt(Vt_p.size))):
            Vt_p[i][j]= centroid_Vt_p((int(math.sqrt(Vt_p.size))-1)/2,i,j)
set_centroid_Vt_p()
plt.matshow(Vt_p)
plt.show()


Inicializando la matriz de dibujo en el material


In [9]:
paint_matrix = matrix(int(size_m),int(size_m))
plt.matshow(paint_matrix)
plt.show()


Ingrese las dimensiones LxW de los transistores


In [10]:
display(Image(url='images/WLCMOS.png'))



In [11]:
W_base=2
WTA=60
WTB=60
WTC=60
WTD=60
lenght_active_si_transistor = 6
L=2

In [12]:
display(Image(url='images/Transistor.png'))
print("W_base de 2 unidades")


W_base de 2 unidades

OPCION 1 de Diseño de los transistores de optimizacion de espacio con centroide comun en la oblea, para usar 2 de esos en la simulacion del espejo de corriente


In [13]:
paint_matrix = matrix(int(size_m),int(size_m))
common_source=9
def opcion1():
    M_center=int((int(math.sqrt(paint_matrix.size))-1)/2)

    TA = matrix(W_base,int((WTA/W_base+1)*(lenght_active_si_transistor/2)))
    for i in range(M_center-2-TA.shape[0],M_center-2):
        for j in range(M_center-2-TA.shape[1],M_center-2):
            paint_matrix[i][j]=1

    TB = matrix(W_base,int((WTB/W_base+1)*(lenght_active_si_transistor/2)))
    for i in range(M_center-2-TB.shape[0],M_center-2):
        for j in range(M_center+3,TB.shape[1]+M_center+3):
            paint_matrix[i][j]=2

    TC = matrix(W_base,int((WTC/W_base+1)*(lenght_active_si_transistor/2)))
    for i in range(M_center+3,TC.shape[0]+M_center+3):
        for j in range(M_center-2-TC.shape[1],M_center-2):
            paint_matrix[i][j]=3

    TD = matrix(W_base,int((WTD/W_base+1)*(lenght_active_si_transistor/2)))
    for i in range(M_center+3,TD.shape[0]+M_center+3):
        for j in range(M_center+3,TD.shape[1]+M_center+3):
            paint_matrix[i][j]=4

opcion1()           
plt.matshow(paint_matrix)
plt.show()


OPCION 2, Diseño de 2 transistores de centroide comun con source compartido (ver imagen). Diseno sugerido de diferentes articulos:

[1] http://class.ece.iastate.edu/vlsi2/docs/Papers%20Done/1999-08-MWSCAS-ML.pdf
[2] http://www.wseas.us/e-library/conferences/2005venice/papers/508-397.pdf

In [14]:
display(Image(url='images/currentmirrorlayout.png'))
print("Diseno propuesto para layout del espejo de corriente")


Diseno propuesto para layout del espejo de corriente

In [15]:
paint_matrix = matrix(int(size_m),int(size_m))
common_source=9
def opcion2():
    
    M_center=int((int(math.sqrt(paint_matrix.size))-1)/2)
    Trasistor_branch_per_side=1
    shape_sides=4
    Transistor_branches=Trasistor_branch_per_side*shape_sides
    branch_W=int(WTA/Transistor_branches)
    TSource=matrix(int(2*branch_W+(lenght_active_si_transistor/2)*3),int(2*branch_W+(lenght_active_si_transistor/2)*3))
    for i in range(M_center-int(TSource.shape[0]/2),M_center+int(TSource.shape[0]/2)):
        for j in range(M_center-int(TSource.shape[0]/2),M_center+int(TSource.shape[0]/2)):
            paint_matrix[i][j]=common_source

    TA_1 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center-2-TA_1.shape[0],M_center-2):
        for j in range(M_center-TA_1.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
            paint_matrix[i][j]=4

    TA_2 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center+3,TA_2.shape[0]+M_center+3):
        for j in range(M_center+int(TSource.shape[0]/2)-1,TA_2.shape[1]+M_center+int(TSource.shape[0]/2)-1):
            paint_matrix[i][j]=4   

    TA_3 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center-TA_3.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
        for j in range(M_center+3,TA_3.shape[0]+M_center+3):
            paint_matrix[i][j]=4

    TA_4 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center+int(TSource.shape[0]/2)-1,TA_4.shape[1]+M_center+int(TSource.shape[0]/2)-1):
        for j in range(M_center-2-TA_4.shape[0],M_center-2):
            paint_matrix[i][j]=4



    TB_1 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center+3,TB_1.shape[0]+M_center+3):
        for j in range(M_center-TB_1.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
            paint_matrix[i][j]=5

    TB_2 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center-2-TB_2.shape[0],M_center-2):
        for j in range(M_center+int(TSource.shape[0]/2)-1,TB_2.shape[1]+M_center+int(TSource.shape[0]/2)-1):
            paint_matrix[i][j]=5

    TB_3 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center-TB_3.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
        for j in range(M_center-2-TB_3.shape[0],M_center-2):
            paint_matrix[i][j]=5

    TB_4 = matrix(branch_W,int(lenght_active_si_transistor))
    for i in range(M_center+int(TSource.shape[0]/2)-1,TB_4.shape[1]+M_center+int(TSource.shape[0]/2)-1):
        for j in range(M_center+3,TB_4.shape[0]+M_center+3):
            paint_matrix[i][j]=5 
        
opcion2()
plt.matshow(paint_matrix)
plt.show()


Calculo del valor promedio de Vt para cada transistor


In [16]:
def prom_Vt_n_for_transistor(transistor_num):
    "Return a prom value of Vt_n for a single transistor in the wafer"
    Vtn_sum=0
    Vtn_found=0
    for i in range(0,int(math.sqrt(paint_matrix.size))):
        for j in range(0,int(math.sqrt(paint_matrix.size))):
            if paint_matrix[i][j] == transistor_num:
                Vtn_sum += Vt_n[i][j]
                Vtn_found += 1
            if paint_matrix[i][j] == common_source:
                Vtn_sum += Vt_n[i][j]
                Vtn_found += 1
                
    Vtn_prom=Vtn_sum/(Vtn_found)

        
    return Vtn_prom
def prom_Vt_p_for_transistor(transistor_num):
    "Return a prom value of Vt_n for a single transistor in the wafer"
    Vtp_sum=0
    Vtp_found=0
    for i in range(0,int(math.sqrt(paint_matrix.size))):
        for j in range(0,int(math.sqrt(paint_matrix.size))):
            if paint_matrix[i][j] == transistor_num:
                Vtp_sum += Vt_p[i][j]
                Vtp_found += 1
            if paint_matrix[i][j] == common_source:
                Vtp_sum += Vt_p[i][j]
                Vtp_found += 1
                
    Vtp_prom=Vtp_sum/(Vtp_found)

        
    return Vtp_prom

Con variacion de variacion a partir de la esquina de Vt en la oblea


In [17]:
print("Para la opcion diseno 1: Transistores ahorro de espacio con centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_corner_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(1)
Vtn_T2=prom_Vt_n_for_transistor(2)
Vtn_T3=prom_Vt_n_for_transistor(3)
Vtn_T4=prom_Vt_n_for_transistor(4)


print("Vt_n Transistor 1: "+str(Vtn_T1))
print("Vt_n Transistor 2: "+str(Vtn_T2))
print("Vt_n Transistor 3: "+str(Vtn_T3))
print("Vt_n Transistor 4: "+str(Vtn_T4))

set_corner_Vt_p()

Vtp_T1=prom_Vt_p_for_transistor(1)
Vtp_T2=prom_Vt_p_for_transistor(2)
Vtp_T3=prom_Vt_p_for_transistor(3)
Vtp_T4=prom_Vt_p_for_transistor(4)


print("Vt_p Transistor 1: "+str(Vtp_T1))
print("Vt_p Transistor 2: "+str(Vtp_T2))
print("Vt_p Transistor 3: "+str(Vtp_T3))
print("Vt_p Transistor 4: "+str(Vtp_T4))

print("Para la opcion diseno 2: Transistores con source comun en centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_corner_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(4)
Vtn_T2=prom_Vt_n_for_transistor(5)
print("Vt_n Transistor 1: "+str(Vtn_T1))
print("Vt_n Transistor 2: "+str(Vtn_T2))


set_corner_Vt_p()

Vtp_T1=prom_Vt_p_for_transistor(4)
Vtp_T2=prom_Vt_p_for_transistor(5)
print("Vt_p Transistor 1: "+str(Vtp_T1))
print("Vt_p Transistor 2: "+str(Vtp_T2))


Para la opcion diseno 1: Transistores ahorro de espacio con centroide: 

Vt_n Transistor 1: 0.8856
Vt_n Transistor 2: 0.91696
Vt_n Transistor 3: 0.88784
Vt_n Transistor 4: 0.9192
Vt_p Transistor 1: 0.9856
Vt_p Transistor 2: 1.01696
Vt_p Transistor 3: 0.98784
Vt_p Transistor 4: 1.0192
Para la opcion diseno 2: Transistores con source comun en centroide: 

Vt_n Transistor 1: 0.901870825688
Vt_n Transistor 2: 0.901870825688
Vt_p Transistor 1: 1.00187082569
Vt_p Transistor 2: 1.00187082569

Con variacion del centro hacia afuera de Vt en la oblea


In [18]:
print("Para la opcion diseno 1: Transistores ahorro de espacio con centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(1)
Vtn_T2=prom_Vt_n_for_transistor(2)
Vtn_T3=prom_Vt_n_for_transistor(3)
Vtn_T4=prom_Vt_n_for_transistor(4)


print("Vt_n Transistor 1: "+str(Vtn_T1))
print("Vt_n Transistor 2: "+str(Vtn_T2))
print("Vt_n Transistor 3: "+str(Vtn_T3))
print("Vt_n Transistor 4: "+str(Vtn_T4))

set_centroid_Vt_p()

Vtp_T1=prom_Vt_p_for_transistor(1)
Vtp_T2=prom_Vt_p_for_transistor(2)
Vtp_T3=prom_Vt_p_for_transistor(3)
Vtp_T4=prom_Vt_p_for_transistor(4)


print("Vt_p Transistor 1: "+str(Vtp_T1))
print("Vt_p Transistor 2: "+str(Vtp_T2))
print("Vt_p Transistor 3: "+str(Vtp_T3))
print("Vt_p Transistor 4: "+str(Vtp_T4))

print("Para la opcion diseno 2: Transistores con source comun en centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()

set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(4)
Vtn_T2=prom_Vt_n_for_transistor(5)
print("Vt_n Transistor 1: "+str(Vtn_T1))
print("Vt_n Transistor 2: "+str(Vtn_T2))


set_centroid_Vt_p()

Vtp_T1=prom_Vt_p_for_transistor(4)
Vtp_T2=prom_Vt_p_for_transistor(5)
print("Vt_p Transistor 1: "+str(Vtp_T1))
print("Vt_p Transistor 2: "+str(Vtp_T2))


Para la opcion diseno 1: Transistores ahorro de espacio con centroide: 

Vt_n Transistor 1: 0.81568172043
Vt_n Transistor 2: 0.81568172043
Vt_n Transistor 3: 0.81568172043
Vt_n Transistor 4: 0.81568172043
Vt_p Transistor 1: 0.91568172043
Vt_p Transistor 2: 0.91568172043
Vt_p Transistor 3: 0.91568172043
Vt_p Transistor 4: 0.91568172043
Para la opcion diseno 2: Transistores con source comun en centroide: 

Vt_n Transistor 1: 0.804579266055
Vt_n Transistor 2: 0.804579266055
Vt_p Transistor 1: 0.904579266055
Vt_p Transistor 2: 0.904579266055

NGSPICE Simulations - 01 Current Mirror

Circuitos a simular:


In [19]:
display(Image(url='images/espejo_n.png'))
print("Espejo NMOS")


Espejo NMOS

In [20]:
display(Image(url='images/espejo_p.png'))
print("Espejo PMOS")


Espejo PMOS

Funcion para editar los archivo de simulacion del espejo NMOS 'espejoNmosPythonFile.cir' y el espejo P 'espejoPmosPythonFile.cir'


In [21]:
import sys
import fileinput
def modificar_cir_Espejo_NMOS(W,L,Vt_T1,Vt_T2):
    text="* Simulación Circuito Espejo de Corriente con Ncmos, valores reales de Kp_n y Vt"+"\n"+ \
    "* Universidad Nacional de Colombia 2016"+"\n"+ \
    "* CMOS Analógico"+"\n"+ \
    "* Grupo Jorge Garzón, Esteban Iafrancesco A"+"\n"+ \
    "\n"+\
    "VDD VDD 0 DC 10 AC 0"+"\n"+\
    "V2 VR 0 DC 10 AC 0"+"\n"+\
    "VRD RDN VR DC 0 AC 0"+"\n"+\
    "RD RDN DRAIN 1000"+"\n"+\
    "RP VDD GATE 2000"+"\n"+\
    "M1 DRAIN GATE 0 0 nmosideal W="+str(W)+" L="+str(L)+"\n"+\
    "M2 GATE GATE 0 0 nmosideal W="+str(W)+" L="+str(L)+"\n"+\
    "\n"+\
    "VRD2 RDN2 VR DC 0 AC 0"+"\n"+\
    "RD2 RDN2 DRAIN2 1000"+"\n"+\
    "RP2 VDD GATE2 2000"+"\n"+\
    "M3 DRAIN2 GATE2 0 0 nmos1 W="+str(W)+" L="+str(L)+"\n"+\
    "M4 GATE2 GATE2 0 0 nmos2 W="+str(W)+" L="+str(L)+"\n"+\
    "\n"+\
    ".model nmosideal nmos LEVEL=1 Vto=0.8 KP=120u LAMBDA=0.01 U0=650"+"\n"+\
    ".model nmos1 nmos LEVEL=1 Vto="+str(Vt_T1)+" KP=120u LAMBDA=0.01 U0=650"+"\n"+\
    ".model nmos2 nmos LEVEL=1 Vto="+str(Vt_T2)+" KP=120u LAMBDA=0.01 U0=650"+"\n"+\
    "\n"+\
    ".control"+"\n"+\
    "set color0 =white"+"\n"+\
    "set color1=black"+"\n"+\
    "op"+"\n"+\
    "show all"+"\n"+\
    "dc vdd 0.7 12 0.01"+"\n"+\
    "plot i(vrd) i(vrd2)"+"\n"+\
    ".endc"+"\n"
    for i, line in enumerate(fileinput.input('../spice-simulations/espejoNmosPythonFile.cir', inplace=1)):
        if i == 1: sys.stdout.write(text) # replace 'sit' and write
    fileinput.close()
def modificar_cir_Espejo_PMOS(W,L,Vt_T1,Vt_T2):
    text="* Simulación Circuito Espejo de Corriente con Ncmos, valores reales de Kp_n y Vt"+"\n"+ \
    "* Universidad Nacional de Colombia 2016"+"\n"+ \
    "* CMOS Analógico"+"\n"+ \
    "* Grupo Jorge Garzón, Esteban Iafrancesco A"+"\n"+ \
    "\n"+\
    "VDD VDD 0 DC -10 AC 0"+"\n"+\
    "V2 VR 0 DC -10 AC 0"+"\n"+\
    "VRD RDN VR DC 0 AC 0"+"\n"+\
    "RD RDN DRAIN 1000"+"\n"+\
    "RP VDD GATE 2000"+"\n"+\
    "M1 DRAIN GATE 0 0 pmosideal W="+str(W)+" L="+str(L)+"\n"+\
    "M2 GATE GATE 0 0 pmosideal W="+str(W)+" L="+str(L)+"\n"+\
    "\n"+\
    "VRD2 RDN2 VR DC 0 AC 0"+"\n"+\
    "RD2 RDN2 DRAIN2 1000"+"\n"+\
    "RP2 VDD GATE2 2000"+"\n"+\
    "M3 DRAIN2 GATE2 0 0 pmos1 W="+str(W)+" L="+str(L)+"\n"+\
    "M4 GATE2 GATE2 0 0 pmos2 W="+str(W)+" L="+str(L)+"\n"+\
    "\n"+\
    ".model pmosideal pmos LEVEL=1 Vto=-0.9 KP=40u LAMBDA=0.0125 U0=250"+"\n"+\
    ".model pmos1 pmos LEVEL=1 Vto=-"+str(Vt_T1)+" KP=40u LAMBDA=0.0125 U0=250"+"\n"+\
    ".model pmos2 pmos LEVEL=1 Vto=-"+str(Vt_T2)+" KP=40u LAMBDA=0.0125 U0=250"+"\n"+\
    "\n"+\
    ".control"+"\n"+\
    "set color0 =white"+"\n"+\
    "set color1=black"+"\n"+\
    "op"+"\n"+\
    "show all"+"\n"+\
    "dc vdd -0.8 -12 -0.01"+"\n"+\
    "plot i(vrd) i(vrd2)"+"\n"+\
    ".endc"+"\n"
    for i, line in enumerate(fileinput.input('../spice-simulations/espejoPmosPythonFile.cir', inplace=1)):
        if i == 1: sys.stdout.write(text) # replace 'sit' and write
    fileinput.close()

Espejo NMOS con variaciones de Vt_n en la oblea

Simulacion con variacion desde el centro de Vt_n en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.


In [22]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_corner_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(1)
Vtn_T2=prom_Vt_n_for_transistor(2)
Vtn_T3=prom_Vt_n_for_transistor(3)
Vtn_T4=prom_Vt_n_for_transistor(4)

#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T2)



In [23]:
display(Image(url='images/corner_Vt_TA_TB_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TA y TB")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TA y TB

In [24]:
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T3)

In [25]:
display(Image(url='images/corner_Vt_TA_TC_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TA y TC")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TA y TC

In [26]:
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T2,Vtn_T3)

In [27]:
display(Image(url='images/corner_Vt_TB_TC_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TB y TC")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TB y TC

Simulacion con variacion desde el centro de Vt_n en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.


In [28]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(1)
Vtn_T2=prom_Vt_n_for_transistor(2)
Vtn_T3=prom_Vt_n_for_transistor(3)
Vtn_T4=prom_Vt_n_for_transistor(4)

#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T2)



In [29]:
display(Image(url='images/centroid_Vt_TA_TB_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TA y TB")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TA y TB

In [30]:
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T2,Vtn_T3)

In [31]:
display(Image(url='images/centroid_Vt_TB_TC_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TB y TC")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TB y TC

Simulacion con variacion desde la esquina de Vt_n en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.


In [32]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_corner_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()

Vtn_T1=prom_Vt_n_for_transistor(4)
Vtn_T2=prom_Vt_n_for_transistor(5)
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T2)



In [33]:
display(Image(url='images/corner_Vt_CS_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Diseno de source compartido")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Diseno de source compartido

Simulacion con variacion desde el centro de Vt_n en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.


In [34]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()

Vtn_T1=prom_Vt_n_for_transistor(4)
Vtn_T2=prom_Vt_n_for_transistor(5)
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T2)



In [35]:
display(Image(url='images/center_Vt_CS_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Diseno de source compartido")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Diseno de source compartido

Espejo PMOS con variaciones en la oblea desde la esquina

Simulacion con variacion desde la esquina de Vt_p en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.


In [36]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_corner_Vt_p()
plt.matshow(Vt_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()

Vtp_T1=prom_Vt_p_for_transistor(1)
Vtp_T2=prom_Vt_p_for_transistor(2)
Vtp_T3=prom_Vt_p_for_transistor(3)
Vtp_T4=prom_Vt_p_for_transistor(4)

#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T2)



In [37]:
display(Image(url='images/corner_Vt_TA_TB_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TA y TB")


VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TA y TB

In [38]:
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T3)

In [39]:
display(Image(url='images/corner_Vt_TA_TC_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TA y TC")


VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TA y TC

In [40]:
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T2,Vtp_T3)

In [41]:
display(Image(url='images/corner_Vt_TB_TC_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TB y TC")


VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TB y TC

Simulacion con variacion desde el centro de Vt_p en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.


In [42]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_centroid_Vt_p()
plt.matshow(Vt_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()

Vtp_T1=prom_Vt_p_for_transistor(1)
Vtp_T2=prom_Vt_p_for_transistor(2)
Vtp_T3=prom_Vt_p_for_transistor(3)
Vtp_T4=prom_Vt_p_for_transistor(4)

#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T2)



In [43]:
display(Image(url='images/center_Vt_LS_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TA y TB")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TA y TB

Simulacion con variacion desde la esquina de Vt_p en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.


In [44]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_corner_Vt_p()
plt.matshow(Vt_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()

Vtp_T1=prom_Vt_p_for_transistor(4)
Vtp_T2=prom_Vt_p_for_transistor(5)
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T2)



In [45]:
display(Image(url='images/corner_Vt_CS_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_p de la oblea. Diseno de source compartido")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_p de la oblea. Diseno de source compartido

Simulacion con variacion desde el centro de Vt_p en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.


In [46]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_centroid_Vt_p()
plt.matshow(Vt_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()

Vtp_T1=prom_Vt_p_for_transistor(4)
Vtp_T2=prom_Vt_p_for_transistor(5)
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T2)



In [47]:
display(Image(url='images/center_Vt_CS_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_p de la oblea. Diseno de source compartido")


VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_p de la oblea. Diseno de source compartido

Conclusiones

[1] Los transistores tipo NPN son mas suceptibles a las variaciones de Vt sobre la oblea que los transistores NPN, debido que los valores tipicos son mas bajos en los primeros. 
[2] La configuracion de diseno 1 de ahorro de espacio en el CI y centroide comun en el centro de la oblea para los transistores tiene buen matching de dos transistores solo cuando el Vt varia del centro hacia afuera de la oblea.
[3] La configuracion de diseno 2 de source compartido y centroide comun en el centro de la oblea tiene las mejores caracteristicas de matchig entre 2 transistores, tanto para variaciones desde la esquina de la oblea como para las variaciones desde el centro.
[4]Asumiendo variaciones desde el centro de la oblea, y diseno 2 de source compartido, el matchig es el mejor y la desviacion con el valor ideal de Vt tambien, lo cual resulta en que el espejo NPN y el PNP se comporten muy parecido a los espejos ideales.
[5] Los espejos de corriente simulados con transistores NPN presentaron una mayor desviacion del comportamiento ideal del espejo de corriente por lo mencionado en el numeral [1], aunque menos significativa que la deferencia presentada con la transconductancia.